import Joi from 'joi';
import { REGEX_PATTERNS, PAGINATION } from '@/constants';

/**
 * 通用验证规则
 */
export const commonValidation = {
  // 邮箱验证
  email: Joi.string()
    .email()
    .pattern(REGEX_PATTERNS.EMAIL)
    .required()
    .messages({
      'string.email': '请输入有效的邮箱地址',
      'string.pattern.base': '邮箱格式不正确',
      'any.required': '邮箱不能为空',
    }),

  // 密码验证
  password: Joi.string()
    .min(8)
    .max(128)
    .pattern(REGEX_PATTERNS.PASSWORD)
    .required()
    .messages({
      'string.min': '密码长度至少为8位',
      'string.max': '密码长度不能超过128位',
      'string.pattern.base': '密码必须包含大小写字母、数字和特殊字符',
      'any.required': '密码不能为空',
    }),

  // 确认密码验证
  confirmPassword: Joi.string()
    .valid(Joi.ref('password'))
    .required()
    .messages({
      'any.only': '确认密码与密码不匹配',
      'any.required': '确认密码不能为空',
    }),

  // 用户名验证
  username: Joi.string()
    .alphanum()
    .min(3)
    .max(20)
    .pattern(REGEX_PATTERNS.USERNAME)
    .required()
    .messages({
      'string.alphanum': '用户名只能包含字母、数字和下划线',
      'string.min': '用户名长度至少为3位',
      'string.max': '用户名长度不能超过20位',
      'string.pattern.base': '用户名格式不正确',
      'any.required': '用户名不能为空',
    }),

  // 手机号验证
  phone: Joi.string()
    .pattern(REGEX_PATTERNS.PHONE)
    .messages({
      'string.pattern.base': '手机号格式不正确',
    }),

  // 中国手机号验证
  chinesePhone: Joi.string()
    .pattern(REGEX_PATTERNS.CHINESE_PHONE)
    .messages({
      'string.pattern.base': '手机号格式不正确',
    }),

  // URL验证
  url: Joi.string()
    .uri()
    .pattern(REGEX_PATTERNS.URL)
    .messages({
      'string.uri': '请输入有效的URL',
      'string.pattern.base': 'URL格式不正确',
    }),

  // ID验证
  id: Joi.string()
    .pattern(/^[0-9a-fA-F]{24}$/)
    .required()
    .messages({
      'string.pattern.base': 'ID格式不正确',
      'any.required': 'ID不能为空',
    }),

  // UUID验证
  uuid: Joi.string()
    .pattern(REGEX_PATTERNS.UUID)
    .required()
    .messages({
      'string.pattern.base': 'UUID格式不正确',
      'any.required': 'UUID不能为空',
    }),

  // 分页参数验证
  page: Joi.number()
    .integer()
    .min(PAGINATION.DEFAULT_PAGE)
    .default(PAGINATION.DEFAULT_PAGE)
    .messages({
      'number.base': '页码必须是数字',
      'number.integer': '页码必须是整数',
      'number.min': '页码不能小于1',
    }),

  limit: Joi.number()
    .integer()
    .min(PAGINATION.MIN_LIMIT)
    .max(PAGINATION.MAX_LIMIT)
    .default(PAGINATION.DEFAULT_LIMIT)
    .messages({
      'number.base': '每页数量必须是数字',
      'number.integer': '每页数量必须是整数',
      'number.min': `每页数量不能小于${PAGINATION.MIN_LIMIT}`,
      'number.max': `每页数量不能超过${PAGINATION.MAX_LIMIT}`,
    }),

  // 日期验证
  date: Joi.date()
    .iso()
    .messages({
      'date.base': '日期格式不正确',
      'date.format': '日期必须是ISO格式',
    }),

  // 名称验证
  name: Joi.string()
    .min(1)
    .max(100)
    .trim()
    .required()
    .messages({
      'string.min': '名称不能为空',
      'string.max': '名称长度不能超过100位',
      'any.required': '名称不能为空',
    }),

  // 描述验证
  description: Joi.string()
    .max(1000)
    .trim()
    .allow('')
    .messages({
      'string.max': '描述长度不能超过1000位',
    }),

  // 状态验证
  status: Joi.string()
    .valid('active', 'inactive', 'pending', 'deleted')
    .default('active')
    .messages({
      'any.only': '状态值无效',
    }),

  // 角色验证
  role: Joi.string()
    .valid('admin', 'user', 'moderator', 'guest')
    .default('user')
    .messages({
      'any.only': '角色值无效',
    }),

  // 排序参数验证
  sortBy: Joi.string()
    .default('createdAt')
    .messages({
      'string.base': '排序字段必须是字符串',
    }),

  sortOrder: Joi.string()
    .valid('asc', 'desc')
    .default('desc')
    .messages({
      'any.only': '排序方向只能是asc或desc',
    }),

  // 搜索关键词验证
  keyword: Joi.string()
    .max(100)
    .trim()
    .allow('')
    .messages({
      'string.max': '搜索关键词长度不能超过100位',
    }),

  // 价格验证
  price: Joi.number()
    .precision(2)
    .min(0)
    .messages({
      'number.base': '价格必须是数字',
      'number.precision': '价格最多保留2位小数',
      'number.min': '价格不能为负数',
    }),

  // 数量验证
  quantity: Joi.number()
    .integer()
    .min(0)
    .messages({
      'number.base': '数量必须是数字',
      'number.integer': '数量必须是整数',
      'number.min': '数量不能为负数',
    }),

  // 标签验证
  tags: Joi.array()
    .items(Joi.string().max(50))
    .max(10)
    .messages({
      'array.base': '标签必须是数组',
      'array.max': '标签数量不能超过10个',
      'string.max': '单个标签长度不能超过50位',
    }),
};

/**
 * 分页验证模式
 */
export const paginationSchema = Joi.object({
  page: commonValidation.page,
  limit: commonValidation.limit,
  sortBy: commonValidation.sortBy,
  sortOrder: commonValidation.sortOrder,
  keyword: commonValidation.keyword,
});

/**
 * ID 参数验证模式
 */
export const idParamsSchema = Joi.object({
  id: commonValidation.id,
});

/**
 * UUID 参数验证模式
 */
export const uuidParamsSchema = Joi.object({
  id: commonValidation.uuid,
});

export default commonValidation;